package com.example.apartment.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.apartment.common.ApiRestResponse;
import com.example.apartment.common.MD5Utils;
import com.example.apartment.common.RespException;
import com.example.apartment.common.RespExceptionEnum;
import com.example.apartment.domain.Admin;
import com.example.apartment.domain.Building;
import com.example.apartment.mapper.AdminMapper;
import com.example.apartment.mapper.BuildingMapper;
import com.example.apartment.service.AdminService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.annotation.Resources;
import java.util.List;

/**
 * UserService 管理员业务层实现类
 *
 * @author wuzexin
 * @date 2021/10/27 17:38
 */
@Service
public class AdminServiceImpl implements AdminService {

    @Resource
    private AdminMapper adminMapper;
    @Resource
    private BuildingMapper buildingMapper;

    /**
     * 管理员注册功能
     *
     * @param username  用户名
     * @param password  密码
     * @param cellphone 手机号码
     */
    @Override
    public void register(String username, String password, String cellphone) {
        // 判断用户名是否存在
        QueryWrapper queryWrapper1 = new QueryWrapper();
        queryWrapper1.eq("username", username);
        Admin admin1 = adminMapper.selectOne(queryWrapper1);
        if (admin1 != null) {
            // 用户名已存在，抛出异常
            throw new RespException(RespExceptionEnum.USERNAME_EXISTS);
        }
        // 判断手机号码是否已经注册
        QueryWrapper queryWrapper2 = new QueryWrapper();
        queryWrapper2.eq("cellphone", cellphone);
        Admin admin2 = adminMapper.selectOne(queryWrapper2);
        if (admin2 != null) {
            // 手机号码已被注册， 抛出异常
            throw new RespException(RespExceptionEnum.CELLPHONE_EXISTS);
        }
        /*
            执行注册
         */
        Admin admin = new Admin();
        admin.setUsername(username);
        // 密码进行MD5加密
        admin.setPassword(MD5Utils.getMD5Str(password));
        admin.setCellphone(cellphone);
        // role角色 0-未审核 1-系统管理员 2-宿舍管理员, 新注册管理员设置未0
        admin.setRole(0);
        int insert = adminMapper.insert(admin);
        if (insert == 0) {
            // 注册失败，抛出异常
            throw new RespException(RespExceptionEnum.REGISTER_FAILED);
        }
    }

    /**
     * 管理员登录功能
     *
     * @param username 用户名
     * @param password 密码
     * @return 管理员用户信息
     */
    @Override
    public Admin adminLogin(String username, String password) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        // 传入进行判断的密码需要经过md5加密
        queryWrapper.eq("password", MD5Utils.getMD5Str(password));
        Admin admin = adminMapper.selectOne(queryWrapper);
        // 判断用户名和密码是否错误
        if (admin == null) {
            // 用户名或密码错误，抛出异常
            throw new RespException(RespExceptionEnum.PASSWORD_WRONG);
        }

        // 获取所管理宿舍楼名字
        if (admin.getRole() == 2) {
            Integer buildingId = admin.getBuildingId();
            Building building = buildingMapper.selectById(buildingId);

            // 将buildingName， 添加到admin实体中
            admin.setBuildingName(building.getBuildingName());
        }

        // 返回用户信息
        return admin;
    }

    /**
     * 查询所有宿舍管理员信息
     *
     * @param admin 管理员用户信息
     * @return 管理员列表
     */
    @Override
    public List<Admin> select(Admin admin) {

        // 判断用户权限，只有系统管理员有权限
        if (admin.getRole() != 1) {
            // 如果不是系统管理员，则抛出权限不够异常
            throw new RespException(RespExceptionEnum.NEED_PERMISSIONS);
        }

        // 查询所有系统管理员和宿舍管理员
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("role", 1);
        queryWrapper.or();
        queryWrapper.eq("role", 2);
        // 系统管理员排在前面
        queryWrapper.orderByAsc("role");
        List<Admin> list = adminMapper.selectList(queryWrapper);

        // 遍历查询对应的楼栋
        for (Admin a : list) {
            if (a.getRole() == 1) {
                a.setBuildingName("全部");
                a.setRoleName("系统管理员");
            } else if (a.getRole() == 2) {
                Building building = buildingMapper.selectById(a.getBuildingId());
                a.setBuildingName(building.getBuildingName());
                a.setRoleName("宿舍管理员");
            }
        }

        // 返回管理员列表
        return list;
    }

    /**
     * 根据ID查询管理员信息
     *
     * @param admin 管理员用户信息
     * @param id    管理员id
     * @return
     */
    @Override
    public Admin seletctById(Admin admin, Integer id) {

        // 判断用户权限，只有系统管理员有权限
        if (admin.getRole() != 1) {
            // 如果不是系统管理员，则抛出权限不够异常
            throw new RespException(RespExceptionEnum.NEED_PERMISSIONS);
        }

        Admin admin1 = adminMapper.selectById(id);
        // 如果admin1不存在，则抛出id不存在异常
        if (admin1 == null) {
            throw new RespException(RespExceptionEnum.ID_NOT_EXISTS);
        }

        // 如果为宿舍管理员，则查询所管理楼栋的名字
        if (admin1.getRole() == 2) {
            Building building = buildingMapper.selectById(admin1.getBuildingId());
            admin1.setBuildingName(building.getBuildingName());
        }

        return admin1;
    }

    /**
     * 修改管理员信息
     *
     * @param admin        管理员用户信息
     * @param id           管理员主键id
     * @param username     用户名
     * @param role         角色
     * @param cellphone    手机号码
     * @param password     密码
     * @param buildingName 宿舍楼名字
     * @return 修改的管理员信息
     */
    @Override
    public Admin update(Admin admin, Integer id, String username, Integer role, String cellphone, String password, String buildingName) {

        // 判断用户权限，只有系统管理员有权限
        if (admin.getRole() != 1) {
            // 如果不是系统管理员，则抛出权限不够异常
            throw new RespException(RespExceptionEnum.NEED_PERMISSIONS);
        }

        // 根据id查询管理员信息
        Admin admin1 = adminMapper.selectById(id);

        // admin1不存在， 抛出异常
        if (admin1 == null) {
            throw new RespException(RespExceptionEnum.ID_NOT_EXISTS);
        }

        // 判断用户名是否重复
        QueryWrapper queryWrapper1 = new QueryWrapper();
        queryWrapper1.eq("username", username);
        Admin usernameAdmin = adminMapper.selectOne(queryWrapper1);
        if (usernameAdmin != null && !usernameAdmin.getId().equals(admin1.getId())){
            // 如果用户名存在，并且对应的id不等于admin1的ID， 抛出异常
            throw new RespException(RespExceptionEnum.USERNAME_EXISTS);
        }

        admin1.setUsername(username);

        admin1.setCellphone(cellphone);

        // 判断密码是否修改过
        if (!admin1.getPassword().equals(password)) {
            // 修改过，则重新进行加密
            admin1.setPassword(MD5Utils.getMD5Str(password));
        }

        // 判断是否为管理员（role==2）
        if (role == 1 || role == 0) {
            admin1.setRole(role);
            admin1.setBuildingId(null);
        }
        if (role == 2) {
            admin1.setRole(2);

            // 判断buildingName是否存在
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("building_name", buildingName);
            Building building = buildingMapper.selectOne(queryWrapper);
            // 如果building不存在，抛出异常
            if (building == null) {
                throw new RespException(RespExceptionEnum.BUILDING_NOT_EXISTS);
            }

            // 判断building是否已经存在管理员
            QueryWrapper adminQueryWrapper = new QueryWrapper();
            adminQueryWrapper.eq("building_id", building.getId());
            Admin admin2 = adminMapper.selectOne(adminQueryWrapper);
            if (admin2 != null && !admin2.getId().equals(admin1.getId())) {
                throw new RespException(RespExceptionEnum.BUILDING_HAS_ADMIN);
            }

            admin1.setBuildingId(building.getId());
        }

        int update = adminMapper.updateById(admin1);

        if (update == 0) {
            throw new RespException(RespExceptionEnum.UPDATE_FAILED);
        }

        return admin1;
    }

    /**
     * 查询所有无权限的管理员
     *
     * @param admin 系统管理员用户信息
     * @return 管理员列表
     */
    @Override
    public List<Admin> selectNoPermissions(Admin admin) {

        // 判断用户权限，只有系统管理员有权限
        if (admin.getRole() != 1) {
            // 如果不是系统管理员，则抛出权限不够异常
            throw new RespException(RespExceptionEnum.NEED_PERMISSIONS);
        }

        // 查询所有无权限管理员（role == 0）
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("role", 0);
        List<Admin> list = adminMapper.selectList(queryWrapper);

        // 遍历查询对应的楼栋
        for (Admin a : list) {
            if (a.getRole() == 0) {
                a.setRoleName("未审核(无权限)");
            }
        }

        // 返回管理员列表
        return list;
    }

    /**
     * 根据id删除管理员信息
     *
     * @param admin 系统管理员用户信息
     * @param id    被删除的管理员id
     */
    @Override
    public void delete(Admin admin, Integer id) {

        // 判断用户权限，只有系统管理员有权限
        if (admin.getRole() != 1) {
            // 如果不是系统管理员，则抛出权限不够异常
            throw new RespException(RespExceptionEnum.NEED_PERMISSIONS);
        }

        Admin admin1 = adminMapper.selectById(id);
        // 判断id是否存在
        if (admin1 == null) {
            // 不存在，则抛出id不存在异常
            throw new RespException(RespExceptionEnum.ID_NOT_EXISTS);
        }

        // 判断是否为无权限管理员
        if (admin1.getRole() != 0) {
            // 抛出删除失败异常
            throw new RespException(RespExceptionEnum.DELETE_FAILED);
        }

        // 删除操作
        int del = adminMapper.deleteById(id);

    }
}
